<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>元学习概览 | Dirac Lee</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noodp" />
<meta name="Description" content="Dirac Lee 的博客"><link rel="prev" href="https://diraclee.gitee.io/2020/12/%E7%8E%B0%E4%BB%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6%E5%85%A5%E9%97%A8/" /><link rel="canonical" href="https://diraclee.gitee.io/2020/12/%E5%85%83%E5%AD%A6%E4%B9%A0%E6%A6%82%E8%A7%88/" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff"><meta property="og:title" content="元学习概览" />
<meta property="og:description" content="" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://diraclee.gitee.io/2020/12/%E5%85%83%E5%AD%A6%E4%B9%A0%E6%A6%82%E8%A7%88/" />
<meta property="article:published_time" content="2020-12-10T00:00:00+00:00" />
<meta property="article:modified_time" content="2020-12-11T00:00:00+00:00" />
<script type="application/ld+json">
    {
        "@context": "http://schema.org",
        "@type": "BlogPosting",
        "headline": "元学习概览",
        "mainEntityOfPage": {
            "@type": "WebPage",
            "@id": "https:\/\/diraclee.gitee.io\/2020\/12\/%E5%85%83%E5%AD%A6%E4%B9%A0%E6%A6%82%E8%A7%88\/"
        },"image": {
                "@type": "ImageObject",
                "url": "https:\/\/diraclee.gitee.io\/logo.png",
                "width":  800 ,
                "height":  600 
            },"genre": "posts","keywords": "元学习, 综述","wordcount":  2814 ,
        "url": "https:\/\/diraclee.gitee.io\/2020\/12\/%E5%85%83%E5%AD%A6%E4%B9%A0%E6%A6%82%E8%A7%88\/","datePublished": "2020-12-10T00:00:00\x2b00:00","dateModified": "2020-12-11T00:00:00\x2b00:00","license": "This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.","publisher": {
                "@type": "Organization",
                "name": "xxxx",
                "logo": {
                "@type": "ImageObject",
                "url": "https:\/\/diraclee.gitee.io\/logo.png",
                "width":  127 ,
                "height":  40 
                }
            },"description": ""
    }
    </script><link rel="stylesheet" href="/css/style.min.css"><link rel="stylesheet" href="/css/lib/fontawesome-free/all.min.css"><link rel="stylesheet" href="/css/lib/animate/animate.min.css"></head>
    <body><script>
            window.isDark = (window.localStorage && window.localStorage.getItem('theme')) === 'dark';
            window.isDark && document.body.classList.add('dark-theme');
        </script><div class="wrapper"><nav class="navbar">
    <div class="navbar-container">
        <div class="navbar-header animated bounceIn">
            <a href="https://diraclee.gitee.io">Dirac Lee</a>
        </div>
        <div class="navbar-menu"><a class="menu-item" href="https://diraclee.gitee.io/posts" title="">文章</a><a class="menu-item" href="https://diraclee.gitee.io/tags" title="">标签</a><a class="menu-item" href="https://diraclee.gitee.io/categories" title="">分类</a><a class="menu-item" href="https://diraclee.gitee.io/about" title="">关于</a><a class="menu-item" href="https://diraclee.gitee.io" title="English"><i class="fas fa-language fa-fw"></i></a><a href="javascript:void(0);" class="theme-switch"><i class="fas fa-adjust fa-rotate-180 fa-fw" title="切换主题"></i></a>
        </div>
    </div>
</nav><nav class="navbar-mobile">
    <div class="navbar-container">
        <div class="navbar-header">
            <div class="navbar-header-title animated bounceIn">
                <a href="https://diraclee.gitee.io">Dirac Lee</a>
            </div>
            <div class="menu-toggle" id="menu-toggle">
                <span></span><span></span><span></span>
            </div>
        </div>
        <div class="navbar-menu" id="mobile-menu"><a class="menu-item" href="https://diraclee.gitee.io/posts" title="">文章</a><a class="menu-item" href="https://diraclee.gitee.io/tags" title="">标签</a><a class="menu-item" href="https://diraclee.gitee.io/categories" title="">分类</a><a class="menu-item" href="https://diraclee.gitee.io/about" title="">关于</a><a class="menu-item" href="https://diraclee.gitee.io" title="English"></a><a href="javascript:void(0);" class="theme-switch"><i class="fas fa-adjust fa-rotate-180 fa-fw" title="切换主题"></i></a>
        </div>
    </div>
</nav><main class="main">
                <div class="container"><article class="page"><h1 class="post-title animated flipInX">元学习概览</h1><div class="post-meta">
            <div class="post-meta-main"><a class="author" href="https://diraclee.gitee.io" rel="author" target="_blank">
                    <i class="fas fa-user-circle fa-fw"></i>Dirac Lee
                </a>&nbsp;<span class="post-category">收录于&nbsp;<i class="far fa-folder fa-fw"></i><a href="https://diraclee.gitee.io/categories/%E5%85%83%E5%AD%A6%E4%B9%A0/">元学习</a>&nbsp;</span></div>
            <div class="post-meta-other"><i class="far fa-calendar-alt fa-fw"></i><time datetime=2020-12-10>2020-12-10</time>&nbsp;
                <i class="fas fa-pencil-alt fa-fw"></i>约 2814 字&nbsp;
                <i class="far fa-clock fa-fw"></i>预计阅读 6 分钟&nbsp;</div>
        </div><div class="post-content"><a class="post-dummy-target" id="一引言sup1httpssitesgooglecomviewicml19metalearningsup"></a><h2>一、引言<sup><a href="https://sites.google.com/view/icml19metalearning" target="_blank">[1]</a></sup></h2>
<p>以往的研究经验表明，大规模的多样化的数据可以提高复杂模型的泛化能力，从 ImageNet<sup><a href="https://arxiv.org/pdf/1409.0575.pdf" target="_blank">[2]</a></sup> 到 Attention<sup><a href="https://dl.acm.org/doi/pdf/10.5555/3295222.3295349" target="_blank">[3]</a></sup> 再到最近的 GPT-2<sup><a href="https://arxiv.org/ftp/arxiv/papers/1908/1908.09203.pdf" target="_blank">[4]</a></sup> 无疑说明了这一点。然而，这一切都是基于监督学习这一语境下的，但如果是在没有大规模已标注数据的场景呢？例如在医学影像、机器人、个性化教育、小语种翻译、推荐系统等任务中，我们上述需求就很难实现。此外，如果我们想要在真实场景下得到一个通用 AI 系统，那么就需要它不断适应之前没有遇到的任务，并且不希望打断它，而是让它自己学习。这一切都打破了监督学习这一范式。</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201212160857.png" alt="" class="lazyload"></figure></p>
<p>报告现场实验表明，对于上图的分类任务，大多数同学根据每个画家的三幅画，就能判断一幅新的画是哪一位画家的作品。人类能够做到根据小批量已标记样本就成功判断一个新样本属于哪一类，靠的就是先前的经验。那么我们是否可以让机器从先前的经验中学习先验知识，从而指导下游的学习过程呢？或者说，是否可以让机器学会学习？</p>
<p>让机器学会学习（learning to learn）的过程就称为元学习（meta-learning），这一名字体现了元学习的目标。元学习还有一个名字叫做小样本学习（few-shot learning），这一名字体现了元学习的应用场景。</p>
<p>认识元学习可以采取两种角度，机械的角度和概率的角度。从机械的角度来看，元学习是一种深度神经网络，它能够通过读取小批量已标记数据来预测新数据点；此外，它使用元数据进行训练，元数据由多个子数据集组成，这些子数据集分别用于训练不同的任务。从这一种角度来看元学习，能够简化元学习算法的实施。从概率的角度来看，元学习系统是指从一组任务中萃取先验信息（这些先验信息能够使得对新任务的学习更有效），然后使用这些先验信息和小批量训练集进行学习，来推断最可能的后验参数。这种角度能够使元学习算法理解起来更为简单。对于研究者来说，以概率的角度来理解更有助于我们对元学习的理解。</p>
<a class="post-dummy-target" id="二问题定义"></a><h2>二、问题定义</h2>
<p>监督学习任务的定义：给定训练数据集 $\mathcal D$，使用最大似然估计求得模型参数 $\phi$，然后用模型参数 $\phi$ 来对新样本点进行推断。</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201209161737.png" alt="" class="lazyload"></figure></p>
<p>但它的问题在于，要想学习出有效的模型，就必须要获取大量的带标签的数据，而对于某些任务来说，带标签的数据却很难得到。</p>
<p>n-way k-shot 任务的定义：给定元数据集 $\mathcal D_{meta-train}$，求得能够涵盖其先验信息的元参数 $\theta$，基于 $\theta$ 和小样本支持数据集 $D$ 最大似然估计模型参数 $\phi$，然后用模型参数 $\phi$ 来对新样本点进行推断。</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211090009.png" alt="" class="lazyload"></figure></p>
<p>上式所表示的学习任务称为 n-way k-shot 问题，其中 $k$ 是一个较小的数（这也是为什么元学习也称为 few-shot learning）。</p>
<a class="post-dummy-target" id="三问题求解"></a><h2>三、问题求解</h2>
<p>我们定义学习元参数 $\theta$ ，认为 $\theta$ 包含了元数据集中所有能够帮助我们解决新任务的信息。我们想要先用一个模型使用最大似然估计求解元参数</p>
<p>$$
\theta^{\star} = \arg \max_\theta \log p(\theta | \mathcal D_{meta-train})
$$</p>
<p>求得 $\theta$ 后我们无需知道具体的  $\mathcal D_{meta-train}$ 就能解决新的任务。元学习任务可表示为如下形式</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201209164047.png" alt="" class="lazyload"></figure></p>
<p>上式中，我们假设 $\phi$ 和 $\mathcal D_{meta-train} | \theta$ 是相互独立的。</p>
<p>之后我们用积分中值定理将上式简化为</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/image-20201209165435208.png" alt="" class="lazyload"></figure></p>
<p>由于
$$
\theta^{\star} = \arg \max_\theta \log p(\theta | \mathcal D_{meta-train})
$$
因此如果之前能够求得 $\theta^{\star}$，那么 $\log p(\theta^{\star} | \mathcal D_{meta-train}) = \max_\theta \log p(\theta | \mathcal D_{meta-train})$  就是定值。因此 n-way k-shot 任务木比奥就转化为：</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211113335.png" alt="" class="lazyload"></figure></p>
<p>因此，我们只需要先求出 $\theta^{\star}$，然后基于上式根据最大似然估计就能求出 n-way k-shot 任务的解 $\phi^{\star}$。其中求得 $\theta^{\star}$ 的过程称为元训练阶段（meta train-time），求得 $\phi^{\star}$ 的过程称为元测试阶段（meta test-time）。</p>
<a class="post-dummy-target" id="四元学习举例"></a><h2>四、元学习举例</h2>
<p>举一个实际应用的例子：我们手头上有 5 张已标记的图片，每张图片各自属于一个类，这些照片-标签对组成支持数据集（support dataset）。我们想要据此预测未标记的图片。</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/image-20201211092558547.png" alt="" class="lazyload"></figure></p>
<p>我们手头上没有额外的属于这 5 个类的已标记图片了，但是还有很多其他类型的已标记图片，称为元训练集 $\mathcal D_{meta-train}$。我们将元训练集按照 5 类一组的方式拆分为 n 个子集，每个子集作为一个 5 分类学习任务。（即将其拆分为和支持数据集一样的形式）</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211093328.png" alt="" class="lazyload"></figure></p>
<p>我们希望能够通过元数据集，让机器学会如何对这类问题进行求解，而这一过程就称为元训练阶段 (meta train-time) 。当机器学会如何对这类问题进行求解之后，我们再让机器提取支持数据集种的信息，从而学会如何将新图片分到这 5 个类，这一过程称为元测试阶段 (meta test-time) 。这一整套任务称为 n-way 5-shot 问题。</p>
<p>如果已知 $\theta^{\star}$，我们只需要在元测试阶段 (meta test-time) 设计神经网络模型</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211094059.png" alt="" class="lazyload"></figure></p>
<p>然后使用最大似然估计</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211093939.png" alt="" class="lazyload"></figure></p>
<p>求得 n-way 5-shot 任务的解，接下来就可以对新样本点 $ \lbrace x^{ts}, y^{ts} \rbrace $ 进行预测。</p>
<p>但问题就在于如何求  $\theta^{\star}$ ，即元训练阶段 (meta train-time) 如何设计。</p>
<p>我们的训练过程基于一个简单的机器学习准则，即 &ldquo;测试与训练的状态必须匹配&quot;<sup><a href="https://paperswithcode.com/paper/matching-networks-for-one-shot-learning" target="_blank">[5]</a></sup>，那么训练与测试必须使用同一个网络，即元训练轮次的网络仍应该是以下结构</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211095048.png" alt="" class="lazyload"></figure></p>
<p>但这里的 $ \lbrace x^{ts}, y^{ts} \rbrace $ 如何定义是一个问题。于是我们将 $\mathcal D_{meta-train}$ 的 每一个子任务数据集 $D_i$ 拆分为两部分</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211095428.png" alt="" class="lazyload"></figure></p>
<p>那么原训练阶段（meta train-time）的网络架构可定义如下</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211095614.png" alt="" class="lazyload"></figure></p>
<p>n-way 5-shot 任务概率分析如下：元训练阶段 (meta train-time) ，我们使用 $\mathcal D_i^{tr}$ 得到 $\phi_i$，因此 $\phi_i = f_\theta (\mathcal D_i^{tr})$ ，然后使用 $D_i^{ts}$ 对 $\theta$ 进行优化从而让 $\phi_i = f_\theta (\mathcal D_i^{tr})$ 适应 $D_i^{ts}$，因此</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211101655.png" alt="" class="lazyload"></figure></p>
<p>元测试阶段（meta test-time），我们使用最大似然估计</p>
<p><figure><img src="/svg/loading.min.svg" data-sizes="auto" data-src="https://gitee.com/DiracLee/picbed/raw/master/img/20201211093939.png" alt="" class="lazyload"></figure></p>
<p>求得最优模型参数 $\phi^{\star}$。</p>
<p>最后，在 n-way k-shot 任务解决阶段，我们用最优模型参数 $\phi^{\star}$预测新的样本点。</p>
<a class="post-dummy-target" id="五总结"></a><h2>五、总结</h2>
<p>本文涉及以下术语：</p>
<ul>
<li>n-way k-shot 任务：对于目标是 k 分类的任务，添加了 n 个额外的 k 分类任务来进行辅助。分为两个阶段：元训练阶段（meta train-time）和元测试阶段（meta test-time）</li>
<li>元训练集 $\mathcal D_{meta-train}$：额外的 n 个任务所用的数据集，均带标签</li>
<li>支持数据集 $\mathcal D$：用于支持最终 k 分类任务所用的数据集，均带标签</li>
<li>元参数：元训练阶段训练出的能够反映元训练集 $\mathcal D_{meta-train}$ 的参数 $\theta$</li>
<li>元训练阶段（meta train-time）：使用元训练集 $\mathcal D_{meta-train}$ 训练出最优元参数 $\theta^{\star}$</li>
<li>元测试阶段（meta test-time）：使用元参数 $\theta^{\star}$ 和支持数据集 $\mathcal D$ 求出最优模型参数 $\phi^{\star}$</li>
<li>n-way k-shot 任务解决阶段：用最优模型参数 $\phi^{\star}$ 来预测新样本点</li>
</ul>
<p>与元学习相关的研究命题：</p>
<ul>
<li>多任务学习：通过对多个相似任务进行学习，从而得到可处理通用任务的模型。可以认为是 0-shot 元学习。</li>
<li>超参数优化：$\theta$ = 超参数，$\phi$ = 网络权重参数的元学习</li>
<li>网络架构搜索：$\theta$ = 架构，$\phi$  = 网络架构参数的元学习</li>
</ul>
<p>本文只是对元学习的整体架构和专业术语进行阐述，具体的算法实施需要进一步学习。</p>
<a class="post-dummy-target" id="参考"></a><h2>参考</h2>
<p>[1] Chelsea Finn &amp; Sergey Levine. (2019). Meta-Learning: from Few-Shot Learning to Rapid  Reinforcement Learning. <em>ICML 2019 Tutorial</em>.</p>
<p>[2] Russakovsky et al. (2014). ImageNet Large Scale Visual Recognition Challenge. <em>Int. J. Comput. Vision</em>.</p>
<p>[3] Vaswani et al. (2018). Attention Is All You Need. <em>NIPS&rsquo;17, 6000-6010.</em></p>
<p>[4] Radford et al. (Nov. 2019). Release Strategies and the Social Impacts of Language Models. <em>OpenAI Report.</em></p>
<p>[5] Vinyals et al. (Jun. 2016). Matching Networks for One-Shot Learning. <em>NeurIPS 2016</em>.</p>
<blockquote>
<p>注：[5] 的源码项目 few-shot 中，需要修改版本号 <code>MarkupSafe==1.1</code> ， <code>torch==1.5.1</code>，<code>torchvision==0.6.1</code>，并需要将<code>pkg-resources==0.0.0</code>去掉）</p>
</blockquote></div><div class="post-footer" id="post-footer">
    <div class="post-info">
        <div class="post-info-line">
            <div class="post-info-mod">
                <span>本文于 2020-12-11 更新</span>
            </div>
            <div class="post-info-license"></div>
        </div>
        <div class="post-info-line">
            <div class="post-info-md"></div>
            <div class="post-info-share"><span><a href="//www.linkedin.com/shareArticle?url=https%3a%2f%2fdiraclee.gitee.io%2f2020%2f12%2f%25E5%2585%2583%25E5%25AD%25A6%25E4%25B9%25A0%25E6%25A6%2582%25E8%25A7%2588%2f&amp;title=%e5%85%83%e5%ad%a6%e4%b9%a0%e6%a6%82%e8%a7%88" target="_blank" title="分享到 LinkedIn">
            <i class="fab fa-linkedin fa-fw"></i>
        </a><a href="//service.weibo.com/share/share.php?url=https%3a%2f%2fdiraclee.gitee.io%2f2020%2f12%2f%25E5%2585%2583%25E5%25AD%25A6%25E4%25B9%25A0%25E6%25A6%2582%25E8%25A7%2588%2f&amp;appkey=&amp;title=%e5%85%83%e5%ad%a6%e4%b9%a0%e6%a6%82%e8%a7%88" target="_blank" title="分享到 Weibo">
            <i class="fab fa-weibo fa-fw"></i>
        </a></span></div>
        </div>
    </div>

    <div class="post-info-more">
        <section><span class="tag">
                        <a href="https://diraclee.gitee.io/tags/%E5%85%83%E5%AD%A6%E4%B9%A0/"><i class="fas fa-tag fa-fw"></i>&nbsp;元学习</a>&nbsp;
                    </span><span class="tag">
                        <a href="https://diraclee.gitee.io/tags/%E7%BB%BC%E8%BF%B0/"><i class="fas fa-tag fa-fw"></i>&nbsp;综述</a>&nbsp;
                    </span></section>
        <section>
            <span><a href="javascript:window.history.back();">返回</a></span>&nbsp;|&nbsp;<span><a href="https://diraclee.gitee.io">主页</a></span>
        </section>
    </div>

    <div class="post-nav"><a href="https://diraclee.gitee.io/2020/12/%E7%8E%B0%E4%BB%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6%E5%85%A5%E9%97%A8/" class="prev" rel="prev" title="现代计算机图形学入门"><i class="fas fa-angle-left fa-fw"></i>现代计算机图形学入门</a></div>
</div><div class="post-comment"></div>
    </article></div>
            </main><footer class="footer">
    <div class="copyright"><div class="copyright-line">由 <a href="https://gohugo.io/" target="_blank" rel="external nofollow noopener noreffer">Hugo</a> 强力驱动 | 主题 - <a href="https://github.com/dillonzq/LoveIt" target="_blank" rel="external nofollow noopener noreffer">LoveIt<i class="far fa-heart fa-fw"></i></a>
        </div>

        <div class="copyright-line"><i class="far fa-copyright fa-fw"></i><span itemprop="copyrightYear">2020</span><span class="author" itemprop="copyrightHolder">&nbsp;<a href="https://diraclee.gitee.io" target="_blank">Dirac Lee</a></span>&nbsp;|&nbsp;<span class="license"><a rel="license external nofollow noopener noreffer" href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank">CC BY-NC 4.0</a></span></div>
    </div>
</footer></div><a href="#" class="dynamic-to-top" id="dynamic-to-top" data-scroll>
            <span>&nbsp;</span>
        </a><script src="/js/lib/jquery/jquery.slim.min.js"></script><script src="/js/lib/lazysizes/lazysizes.min.js"></script><script src="/js/lib/smooth-scroll/smooth-scroll.polyfills.min.js"></script><script>window.scroll = new SmoothScroll('[data-scroll]', {speed: 300, speedAsDuration: true});</script><link rel="stylesheet" href="/css/lib/katex/katex.min.css"><script src="/js/lib/katex/katex.min.js"></script><script defer src="/js/lib/katex/auto-render.min.js"></script><link rel="stylesheet" href="/css/lib/katex/copy-tex.min.css"><script defer src="/js/lib/katex/copy-tex.min.js"></script><script defer src="/js/lib/katex/mhchem.min.js"></script><script>
        document.addEventListener("DOMContentLoaded", function () {
            renderMathInElement(document.body, {
                delimiters: [
                    { left: "$$", right: "$$", display: true },
                    { left: "\\(", right: "\\)", display: false },
                    { left: "\\[", right: "\\]", display: true },{ left: "$", right: "$", display: false },]
            });
        });
    </script><script src="/js/blog.min.js"></script></body>
</html>